/**
 * @file gd32f4_i2c.h
 * @brief GD32F407 I2C 接口驱动头文件
 * 
 * 本驱动基于GD32F407标准库实现I2C通信接口
 * - 支持软件实现和硬件实现（通过 I2C_MODE_SW 宏选择）
 * - 支持标准模式(100K)和快速模式(400K)（通过 FAST 宏选择）
 * - 硬件模式使用内部I2C0硬件外设资源(记得引入依赖文件)
 * - 使用PB6(SCL)和PB7(SDA)引脚
 * 
 * @note 状态返回值说明：
 * - I2C_SUCCESS(0)：操作成功
 * - I2C_ERROR_DEV_ADDR：设备地址发送失败，无应答
 * - I2C_ERROR_REG_ADDR：寄存器地址发送失败，无应答
 * - I2C_ERROR_READ_ADDR：发送设备地址(读模式)失败，无应答
 * - I2C_ERROR_DATA_SEND：数据发送过程中失败，无应答
 * - I2C_TIMEOUT：通信超时
 * - I2C_BUSY：I2C总线忙
 * 
 * @author Created on: 2025年6月9日
 * @version 1.1
 */



#ifndef GD32F4_I2C_H
#define GD32F4_I2C_H
#include "gd32f4_gpio.h"
#include "gd32f4xx_i2c.h"
#include "systick.h"

//模式选择
#define I2C_MODE_SW 1   // 0：软实现、1：硬实现
#define  FAST    1      // 0：标准100K、1：快速400K


// PB6 - SCL时钟线
#define SCL_RCU     RCU_GPIOB
#define SCL_PORT    GPIOB
#define SCL_PIN     GPIO_PIN_6

// PB7 - SDA数据线
#define SDA_RCU     RCU_GPIOB
#define SDA_PORT    GPIOB
#define SDA_PIN     GPIO_PIN_7

// I2C状态定义
typedef enum {
    I2C_SUCCESS = 0,            /*!< I2C操作成功 */
    I2C_ERROR_DEV_ADDR,         /*!< 设备地址发送失败，无应答 */
    I2C_ERROR_REG_ADDR,         /*!< 寄存器地址发送失败，无应答 */
    I2C_ERROR_READ_ADDR,        /*!< 发送设备地址(读模式)失败，无应答 */
    I2C_ERROR_DATA_SEND,        /*!< 数据发送过程中失败，无应答 */
    I2C_TIMEOUT,                /*!< I2C操作超时 */
    I2C_BUSY                    /*!< I2C总线忙 */
} i2c_ret_t;


#if (I2C_MODE_SW == 0)   // 软实现
    /*-----*/
#elif (I2C_MODE_SW == 1) // 硬实现


#define I2C_NUM         I2C0
#define I2C_RCU         RCU_I2C0

#define SCL_PIN_AF      GPIO_AF_4
#define SDA_PIN_AF      GPIO_AF_4

#endif



void MyI2C_Init();

i2c_ret_t MyI2C_Device_Scan(uint8_t *device_addr);

i2c_ret_t MyI2C_Write(uint8_t dev_addr,uint8_t mem_addr, uint8_t *data, uint16_t length);

i2c_ret_t MyI2C_Read(uint8_t dev_addr,uint8_t reg_addr, uint8_t *data, uint32_t number);










#endif // GD32F4_I2C_H



